package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.ord.entity.OrdWaybillNoManagement;

import javax.annotation.Resource;
import java.util.List;

/**
 * Package: com.sz.biz.logistics.ord.service<br>
 * Description: 订单编号管理service<br>
 * @author WuHan<br>
 * Date: 2017-09-12 16:25<br>
 * @since sys-1.1.1.7
 */
@Resource
public interface OrdWaybillNoManagementService {
    
    /**
     * 单体保存订单信息
     * @param ordWaybillNoManagement 订单信息实体类，{@link OrdWaybillNoManagement}
     * @return 插入条目成功则返回记录数
     * */
    int save(OrdWaybillNoManagement ordWaybillNoManagement);
    
    /**
     * 单体保存订单信息
     * @param serviceType 业务类型，见{@link com.sz.biz.logistics.ord.enums.OrdServiceTypeEnum}
     * @param serialNumber 序列号
     * @param verificationCode 校验位
     * @return 插入条目成功则返回记录数
     * */
    int save(String serviceType, String serialNumber, String verificationCode);
    
    /**
     * 单体保存订单信息
     * @param serviceType 业务类型，见{@link com.sz.biz.logistics.ord.enums.OrdServiceTypeEnum}
     * @param serialNumber 序列号
     * @param verificationCode 校验位
     * @param isUsed 是否已使用
     * @param isDeleted 是否已删除
     * @param isPrearranged 是否为预分配号码
     * @return 插入条目成功则返回记录数
     * */
    int save(String serviceType, String serialNumber, String verificationCode, boolean isUsed, boolean isPrearranged, boolean isDeleted);
    
    /**
     * 获取三种业务类型各自当前最大已使用的非预分配单号值
     * @return 三个值，若不存在，则返回值默认为"00000000"
     * */
    List<String> fetchTopNumbers();
    
    /**
     * 单号碰撞检测，用以判断将要分配的单号是否同预分配区间产生碰撞。
     * @param serviceType 业务类型，见{@link com.sz.biz.logistics.ord.enums.OrdServiceTypeEnum}
     * @param serialNumber 序列号
     * @return 是否产生碰撞。<br>True - 产生碰撞<br>False - 未产生碰撞
     * */
    boolean collisionDetect(String serviceType, String serialNumber);
    
    /**
     * 号段碰撞检测，用以判断将要分配的号段是否同现有已分配号段及单号记录产生碰撞。
     * @param serviceType 业务类型，见{@link com.sz.biz.logistics.ord.enums.OrdServiceTypeEnum}
     * @param startIndex 号段起点
     * @param endIndex 号段终点
     * @return 是否产生碰撞。<br>True - 产生碰撞<br>False - 未产生碰撞
     * */
    boolean collisionDetect(String serviceType, String startIndex, String endIndex);
}
